package net.oschina.dajiangnan.wx;

import net.oschina.dajiangnan.wx.process.pay.bean.CloseOrderResult;
import net.oschina.dajiangnan.wx.process.pay.bean.LoadBillResult;
import net.oschina.dajiangnan.wx.process.pay.bean.RefundQueryResult;
import net.oschina.dajiangnan.wx.process.pay.bean.RefundResult;
import net.oschina.dajiangnan.wx.process.pay.bean.URLShortReult;
import net.oschina.dajiangnan.wx.process.pay.tools.Micropay;
import net.oschina.dajiangnan.wx.process.pay.tools.Orderclose;
import net.oschina.dajiangnan.wx.process.pay.tools.Orderquery;
import net.oschina.dajiangnan.wx.process.pay.tools.Orderquery.Result;
import net.oschina.dajiangnan.wx.process.pay.tools.Other;
import net.oschina.dajiangnan.wx.process.pay.tools.Refund;
import net.oschina.dajiangnan.wx.process.pay.tools.Reverse;
import net.oschina.dajiangnan.wx.qr.Qrcode;
import net.oschina.dajiangnan.wx.qr.Qrcode.AlreadExistQRCodeException;

public class WxApi {

	/**
	 * 根据微信订单号查询订单状态
	 * https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_2
	 * 
	 * @param transactionid
	 *            微信系统生成的订单号
	 * @return
	 */
	public static Result queryOrderByTransactionId(String transactionid) {
		return Orderquery.queryByTransactionId(transactionid);
	}

	/**
	 * 根据商户订单号查询订单状态
	 * 
	 * @param orderid
	 *            商户后台(weixin-sdk模块)生成的订单号
	 * @return
	 */
	public static Result queryOrderByOrderid(String orderid) {
		return Orderquery.queryByOrderid(orderid);
	}

	/**
	 * 增加一个扫码支付的配置
	 * 
	 * @param productid
	 *            商品id
	 * @param body
	 *            商品描述
	 * @param detail
	 *            商品详情
	 * @param fee
	 *            商品价格(分)
	 * @return 生成二维码图片的路径
	 * @throws AlreadExistQRCodeException
	 *             已经生成过相同的ProductId抛出这个异常,如果要重新生成，请先调用delQrCodeConfig删除配置
	 */
	public static synchronized String addQrCodeConfig(String productid,
			String body, String detail, int fee)
			throws AlreadExistQRCodeException {
		return Qrcode.addQrCodeConfig(productid, body, detail, fee);
	}

	/**
	 * 删除一个扫码支付的配置
	 * 
	 * @param productid
	 *            商品id
	 * @return 删除成功或失败
	 */
	public static synchronized boolean delQrCodeConfig(String productid) {
		return Qrcode.delQrCodeConfig(productid);
	}

	/**
	 * 关闭订单
	 * https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_3
	 * 
	 * @param out_trade_no
	 *            商户内部订单号
	 * @return BaseResult
	 */
	public static CloseOrderResult closeOrder(String out_trade_no) {
		return Orderclose.closeOrder(out_trade_no);
	}

	/**
	 * 生成短链接
	 * http://mp.weixin.qq.com/wiki/10/165c9b15eddcfbd8699ac12b0bd89ae6.html
	 * @param longURL
	 * @return URLShortReult
	 */
	public static URLShortReult initShortURL(String longURL) {
		return Other.initShortURL(longURL);
	}

	/**
	 * 申请退款
	 * 
	 * https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_4
	 * 
	 * @param transaction_id
	 *            微信订单号
	 * @param out_trade_no
	 *            商户订单号
	 * @param out_refund_no
	 *            商户退款单号,该单号自己定义，不重复的长字符串即可
	 * @param total_fee
	 *            总金额
	 * @param refund_fee
	 *            退款金额
	 * @param op_user_id
	 *            退款申请人
	 * @return RefundResult
	 */
	public static RefundResult refund(String transaction_id,
			String out_trade_no, String out_refund_no, int total_fee,
			int refund_fee, String op_user_id) {
		return Refund.refund(transaction_id, out_trade_no, out_refund_no,
				total_fee, refund_fee, op_user_id);
	}

	/**
	 * 退款查询 (特殊说明：transaction_id，out_trade_no，out_refund_no，refund_id四个参数四选一即可)
	 * https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_5
	 * @param transaction_id
	 *            微信订单号
	 * @param out_trade_no
	 *            商户订单号
	 * @param out_refund_no
	 *            商户退款单号
	 * @param refund_id
	 *            微信退款单号
	 * @return RefundQueryResult
	 * 
	 */
	public static RefundQueryResult refundQuery(String transaction_id,
			String out_trade_no, String out_refund_no, String refund_id) {
		return Refund.refundQuery(transaction_id, out_trade_no, out_refund_no,
				refund_id);
	}

	/**
	 * 下载对账单
	 * 
	 * @param bill_date
	 *            格式yyyymmdd
	 * @param bill_type
	 *            ALL，返回当日所有订单信息，默认值;SUCCESS，返回当日成功支付的订单;REFUND，返回当日退款订单;REVOKED
	 *            ，已撤销的订单;
	 */
	public static LoadBillResult downloadbill(String bill_date, String bill_type) {
		return Other.downloadbill(bill_date, bill_type);
	}
	
	
	
	
	
	
	
	
	
	
	/**
     * 提交刷卡支付API
     * https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1
     * 
     * @param device_info 终端设备号(商户自定义，如门店编号)
     * @param body 商品描述
     * @param detail 商品详情
     * @param out_trade_no 商户系统内部的订单号,32个字符内、可包含字母
     * @param total_fee 订单总金额，单位为分
     * @param spbill_create_ip 调用微信支付API的机器IP
     * @param auto_code 扫码支付授权码，设备读取用户微信中的条码或者二维码信息
     * 
     * @return
     * 
     *  //微信支付订单号
        transaction_id;
        //商户订单号
        out_trade_no;
        //SUCCESS/FAIL
        result_code;
        //错误描述
        err_code_des;
        //错误码
        err_code;
        //订单生成时间
        time_end;
     */
	public static Micropay.Result submitMicropay(String device_info,String body,String detail,String out_trade_no,int total_fee,String spbill_create_ip,String auth_code){
	    return Micropay.submitMicropay(device_info, body, detail, out_trade_no, total_fee, spbill_create_ip, auth_code);
	}
	
	
	
	
	
	/**
     * 根据微信订单号撤销订单
     * https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_11&index=3
     * 
     * 
     * @param transaction_id 微信的订单号，优先使用
     * @return
     * 
     *  //SUCCESS/FAIL
        String result_code;
        //错误描述
        String err_code_des;
        //错误码
        String err_code;
        //是否需要继续调用撤销，Y-需要，N-不需要
        String recall;
     */
	public static Reverse.Result reverseByTransactionId(String transaction_id){
	    return Reverse.reverseByTransactionId(transaction_id);
	}
	
	
	
	/**
     * 根据商户订单号撤销订单
     * https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_11&index=3
     * 
     * 
     * @param out_trade_no 商户系统内部的订单号,transaction_id、out_trade_no二选一，如果同时存在优先级：transaction_id> out_trade_no
     * @return
     * 
     *  //SUCCESS/FAIL
        String result_code;
        //错误描述
        String err_code_des;
        //错误码
        String err_code;
        //是否需要继续调用撤销，Y-需要，N-不需要
        String recall;
     */
	public static Reverse.Result reverseByOutTradeNo(String out_trade_no){
        return Reverse.reverseByOutTradeNo(out_trade_no);
    }
}
